package com.ruoyi.flink.util.db;

import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.exceptions.JedisException;

/**
 * @Description: 获取redis链接(这种方式似乎和flink无关吧,暂时先放在这里)
 * @ClassName: RedisLink
 * @author syc
 * @date: 2022年5月30日 下午4:06:22
 */

public class RedisLink {
	/**
	 * 	mark为1表示使用单机模式，mark为2表示使用集群模式
	 */
	private static int mark = 2;
    private static JedisPool jedisPool = null;
    private static JedisCluster jedisCluster = null;
    
    static{
    	JedisPoolConfig config = new JedisPoolConfig();
		config.setMaxTotal(1000);//jedis的最大活跃连接数
		config.setMaxIdle(50);//jedis最大空闲连接数
		config.setMaxWaitMillis(-1);//jedis池没有连接对象返回时，等待可用连接的最大时间，单位毫秒，默认值为-1，表示永不超时。 如果超过等待时间，则直接抛出JedisConnectionException
        config.setTestOnBorrow(true);//从池中获取连接的时候，是否进行有效检查
		config.setTestOnReturn(true);//归还连接的时候，是否进行有效检查
		
		if(mark==1) {
			jedisPool = new JedisPool(config, "127.0.0.1", 6379, 0, "rick");
		} else if(mark==2) {
			Set<HostAndPort> nodes = new HashSet<HostAndPort>();
	 		nodes.add(new HostAndPort("192.168.30.95", 6601));
	 		nodes.add(new HostAndPort("192.168.30.95", 6602));
	 		nodes.add(new HostAndPort("192.168.30.95", 6603));
	 		nodes.add(new HostAndPort("192.168.30.95", 6604));
	 		nodes.add(new HostAndPort("192.168.30.95", 6605));
	 		nodes.add(new HostAndPort("192.168.30.95", 6606));
	 		jedisCluster = new JedisCluster(nodes, 10, 0, 2, "rick", config);
		}
    }
    
    /**
     * 	获取资源，适用于单机模式
     * @return
     */
    public static Jedis getResource() {
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
        } catch (JedisException e) {
        	close(jedis);
        }
        return jedis;
    }

    /**
     * 	归还资源，适用于单机模式
     * @param jedis
     * @param
     */
	public static void close(Jedis jedis) {
		try {
	        if (jedis != null) {
	        	jedis.close();
	        }
        } catch (JedisException e) {
        	
        }
    }
    
	/**
	 * @Description: 判断主键是否存在
	 * @param key
	 * @return 
	 * @author: wangwk
	 * @date: 2020年7月2日 下午5:38:28
	 * @return: Boolean
	 */
    public static Boolean exists(String key) {
    	Jedis jedis = null;
        try {
        	if(mark==1) {
                jedis = getResource();
                return jedis.exists(key);
    		} else if(mark==2) {
    			return jedisCluster.exists(key);
    		}
        } catch (Exception ex) {
        	System.out.println(ex.getMessage());
        } finally {
        	close(jedis);
        }
        return false;
    }
    
    /**
     * @Description: 根据主键删除信息
     * @param key
     * @return 
     * @author: wangwk
     * @date: 2020年7月2日 下午5:42:18
     * @return: Long
     */
    public static Long del(String key) {
    	Jedis jedis = null;
        try {
        	if(mark==1) {
                jedis = getResource();
                return jedis.del(key);
    		} else if(mark==2) {
    			return jedisCluster.del(key);
    		}
        } catch (Exception ex) {
        	System.out.println(ex.getMessage());
        } finally {
        	close(jedis);
        }
        return null;
    }
    
    /**
     * @Description: 根据主键删除信息
     * @param key
     * @return 
     * @author: wangwk
     * @date: 2020年7月2日 下午5:44:05
     * @return: Long
     */
    public static Long del(String... key) {
    	Jedis jedis = null;
        try {
        	if(mark==1) {
                jedis = getResource();
                return jedis.del(key);
    		} else if(mark==2) {
    			return jedisCluster.del(key);
    		}
        } catch (Exception ex) {
        	System.out.println(ex.getMessage());
        } finally {
        	close(jedis);
        }
        return null;
    }
    
    /**
     * @Description: 模糊查询获取已存在的主键
     * @param pattern
     * @return 
     * @author: wangwk
     * @date: 2020年7月2日 下午5:38:46
     * @return: Set<String>
     */
    public static Set<String> keys(String pattern) {
    	Jedis jedis = null;
        try {
        	if(mark==1) {
                jedis = getResource();
                return jedis.keys(pattern);
    		} else if(mark==2) {
    			return jedisCluster.hkeys(pattern);
    		}
        } catch (Exception ex) {
        	System.out.println(ex.getMessage());
        } finally {
        	close(jedis);
        }
        return null;
    }
    
    /**
     * @Description: 设置KEY的生存时间，单位是毫秒；生存时间是一个时间值，表示从当前时间开始，经过多少秒过期；
     * @param key
     * @param milliseconds
     * @return 
     * @author: wangwk
     * @date: 2020年7月1日 上午10:48:25
     * @return: Long
     */
    public static Long pexpire(String key, Long milliseconds) {
    	Jedis jedis = null;
        try {
        	if(mark==1) {
                jedis = getResource();
                return jedis.pexpire(key, milliseconds);
    		} else if(mark==2) {
    			return jedisCluster.pexpire(key, milliseconds);
    		}
        } catch (Exception ex) {
        	System.out.println(ex.getMessage());
        } finally {
        	close(jedis);
        }
        return null;
    }
    
    /**
     * @Description: 设置KEY的过期时间，单位是毫秒；
     * 	过期时间是一个Unix时间戳，是一个时间点，比如2015-06-11 12:00:00，当然这个时间值需要转换成Unix时间戳的形式
     * @param key
     * @param millisecondsTimestamp
     * @return 
     * @author: wangwk
     * @date: 2020年7月1日 上午11:12:10
     * @return: Long
     */
    public static Long pexpireAt(String key, Long millisecondsTimestamp) {
    	Jedis jedis = null;
        try {
        	if(mark==1) {
                jedis = getResource();
                 return jedis.pexpireAt(key, millisecondsTimestamp);
    		} else if(mark==2) {
    			return jedisCluster.pexpireAt(key, millisecondsTimestamp);
    		}
        } catch (Exception ex) {
        	System.out.println(ex.getMessage());
        } finally {
        	close(jedis);
        }
        return null;
    }
    
    /**
     * @Description: String(字符串)模式：根据主键获取值
     * @param key
     * @return 
     * @author: wangwk
     * @date: 2020年7月2日 下午5:39:46
     * @return: String
     */
    public static String get(String key) {
    	Jedis jedis = null;
        try {
        	if(mark==1) {
                jedis = getResource();
                return jedis.get(key);
    		} else if(mark==2) {
    			return jedisCluster.get(key);
    		}
        } catch (Exception ex) {
        	System.out.println(ex.getMessage());
        } finally {
        	close(jedis);
        }
        return null;
    }
    
    /**
     * @Description: String(字符串)模式：设置主键和值
     * @param key
     * @param value
     * @return 
     * @author: wangwk
     * @date: 2020年7月2日 下午5:41:17
     * @return: String
     */
    public static String set(String key, String value) {
    	Jedis jedis = null;
        try {
        	if(mark==1) {
                jedis = getResource();
                return jedis.set(key, value);
    		} else if(mark==2) {
    			return jedisCluster.set(key, value);
    		}
        } catch (Exception ex) {
        	System.out.println(ex.getMessage());
        } finally {
        	close(jedis);
        }
        return null;
    }
    
    /**
     * @Description: Set(集合)模式：判断指定的信息是否存在
     * @param key
     * @param members
     * @return 
     * @author: wangwk
     * @date: 2020年7月2日 下午5:44:40
     * @return: Boolean
     */
    public static Boolean sismember(String key, String members){
    	Jedis jedis = null;
        try {
        	if(mark==1) {
                jedis = getResource();
                return jedis.sismember(key, members);
    		} else if(mark==2) {
    			return jedisCluster.sismember(key, members);
    		}
        } catch (Exception ex) {
        	System.out.println(ex.getMessage());
        } finally {
        	close(jedis);
        }
        return false;
    }
    
    /**
     * @Description: Set(集合)模式：向集合添加一个或多个成员
     * @param key
     * @param members
     * @return 
     * @author: wangwk
     * @date: 2020年7月2日 下午5:45:05
     * @return: Long
     */
    public static Long sadd(String key, String... members){
    	Jedis jedis = null;
        try {
        	if(mark==1) {
                jedis = getResource();
                return jedis.sadd(key, members);
    		} else if(mark==2) {
    			return jedisCluster.sadd(key, members);
    		}
        } catch (Exception ex) {
        	System.out.println(ex.getMessage());
        } finally {
        	close(jedis);
        }
        return null;
    }
    
    /**
     * @Description: Set(集合)模式：根据主键获取所有集合信息
     * @param key
     * @return 
     * @author: wangwk
     * @date: 2020年7月2日 下午5:45:16
     * @return: Set<String>
     */
    public static Set<String> smembers(String key){
    	Jedis jedis = null;
        try {
        	if(mark==1) {
                jedis = getResource();
                return jedis.smembers(key);
    		} else if(mark==2) {
    			return jedisCluster.smembers(key);
    		}
        } catch (Exception ex) {
        	System.out.println(ex.getMessage());
        } finally {
        	close(jedis);
        }
        return null;
    }
    
    /**
     * @Description: Set(集合)模式：获取集合的数量
     * @param key
     * @return 
     * @author: wangwk
     * @date: 2020年7月2日 下午5:48:41
     * @return: Long
     */
    public static Long scard(String key){
    	Jedis jedis = null;
        try {
        	if(mark==1) {
                jedis = getResource();
                return jedis.scard(key);
    		} else if(mark==2) {
    			return jedisCluster.scard(key);
    		}
        } catch (Exception ex) {
        	System.out.println(ex.getMessage());
        } finally {
        	close(jedis);
        }
        return 0L;
    }
    
    /**
     * @Description: Set(集合)模式：删除集合信息
     * @param key
     * @param members
     * @return 
     * @author: wangwk
     * @date: 2020年7月2日 下午5:48:52
     * @return: Long
     */
    public static Long srem(String key, String... members){
    	Jedis jedis = null;
        try {
        	if(mark==1) {
                jedis = getResource();
                return jedis.srem(key, members);
    		} else if(mark==2) {
    			return jedisCluster.srem(key, members);
    		}
        } catch (Exception ex) {
        	System.out.println(ex.getMessage());
        } finally {
        	close(jedis);
        }
        return null;
    }
    
    /**
     * @Description: Hash(字典)模式：查看哈希表 key 中，指定的字段是否存在。
     * @param key
     * @param field
     * @return 
     * @author: wangwk
     * @date: 2020年7月2日 下午5:50:27
     * @return: Boolean
     */
    public static Boolean hexists(String key, String field) {
    	Jedis jedis = null;
        try {
        	if(mark==1) {
                jedis = getResource();
                return jedis.hexists(key, field);
    		} else if(mark==2) {
    			return jedisCluster.hexists(key, field);
    		}
        } catch (Exception ex) {
        	System.out.println(ex.getMessage());
        } finally {
        	close(jedis);
        }
        return false;
    }
    
    /**
     * @Description: Hash(字典)模式：同时将多个 field-value (域-值)对设置到哈希表 key 中。
     * @param key
     * @param hash
     * @return 
     * @author: wangwk
     * @date: 2020年7月2日 下午5:50:39
     * @return: String
     */
    public static String hmset(String key, Map<String, String> hash) {
    	Jedis jedis = null;
        try {
        	if(mark==1) {
                jedis = getResource();
                return jedis.hmset(key, hash);
    		} else if(mark==2) {
    			return jedisCluster.hmset(key, hash);
    		}
        } catch (Exception ex) {
        	System.out.println(ex.getMessage());
        } finally {
        	close(jedis);
        }
        return null;
    }
    
    /**
     * @Description: Hash(字典)模式：将哈希表 key 中的字段 field 的值设为 value 。
     * @param key
     * @param field
     * @param value
     * @return 
     * @author: wangwk
     * @date: 2020年7月2日 下午5:50:48
     * @return: Long
     */
    public static Long hset(String key, String field, String value) {
    	Jedis jedis = null;
        try {
        	if(mark==1) {
                jedis = getResource();
                return jedis.hset(key, field, value);
    		} else if(mark==2) {
    			return jedisCluster.hset(key, field, value);
    		}
        } catch (Exception ex) {
        	System.out.println(ex.getMessage());
        } finally {
        	close(jedis);
        }
        return null;
    }
    
    /**
     * @Description: Hash(字典)模式：为哈希表 key 中的指定字段的整数值加上增量 increment 。
     * @param key
     * @param field
     * @param value
     * @return 
     * @author: wangwk
     * @date: 2020年7月2日 下午5:51:00
     * @return: Long
     */
    public static Long hincrBy(String key, String field, Long value) {
    	Jedis jedis = null;
        try {
        	if(mark==1) {
                jedis = getResource();
                return jedis.hincrBy(key, field, value);
    		} else if(mark==2) {
    			return jedisCluster.hincrBy(key, field, value);
    		}
        } catch (Exception ex) {
        	System.out.println(ex.getMessage());
        } finally {
        	close(jedis);
        }
        return null;
    }
    
    /**
     * @Description: Hash(字典)模式：获取给定字段的值
     * @param key
     * @param field
     * @return 
     * @author: wangwk
     * @date: 2020年7月2日 下午5:51:09
     * @return: String
     */
    public static String hget(String key, String field) {
    	Jedis jedis = null;
        try {
        	if(mark==1) {
                jedis = getResource();
                return jedis.hget(key, field);
    		} else if(mark==2) {
    			return jedisCluster.hget(key, field);
    		}
        } catch (Exception ex) {
        	System.out.println(ex.getMessage());
        } finally {
        	close(jedis);
        }
        return null;
    }
    
    /**
     * @Description: Hash(字典)模式：获取哈希表中所有值。
     * @param key
     * @return 
     * @author: wangwk
     * @date: 2020年7月2日 下午5:51:17
     * @return: Map<String,String>
     */
    public static Map<String, String> hgetAll(String key) {
    	Jedis jedis = null;
        try {
        	if(mark==1) {
                jedis = getResource();
                return jedis.hgetAll(key);
    		} else if(mark==2) {
    			return jedisCluster.hgetAll(key);
    		}
        } catch (Exception ex) {
        	System.out.println(ex.getMessage());
        } finally {
        	close(jedis);
        }
        return null;
    }
    
    /**
     * @Description: Hash(字典)模式：删除一个或多个哈希表字段
     * @param key
     * @param fields
     * @return 
     * @author: wangwk
     * @date: 2020年7月2日 下午5:51:23
     * @return: Long
     */
    public static Long hdel(String key, String fields) {
    	Jedis jedis = null;
        try {
        	if(mark==1) {
                jedis = getResource();
                return jedis.hdel(key, fields);
    		} else if(mark==2) {
    			return jedisCluster.hdel(key, fields);
    		}
        } catch (Exception ex) {
        	System.out.println(ex.getMessage());
        } finally {
        	close(jedis);
        }
        return null;
    }

}
